package cn.com.stary1993.kite.captcha.config;

import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;
import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 行为图形验证码配置
 *
 * @author stary1993
 */
@Data
@ConfigurationProperties(prefix = CaptchaProperties.PREFIX + "." + CaptchaProperties.BEHAVIOR)
public class BehaviorImageCaptchaProperties {

    /**
     * 是否开启
     */
    private Boolean enabled = true;

    /**
     * 容错率
     */
    private Float defaultTolerant = 0.02F;

    /**
     * 过期key 前缀.
     */
    private String keyPrefix = "behavior";

    /**
     * 过期时间.
     */
    private Expire expire = new Expire();

    /**
     * 是否清空默认模板
     */
    private Boolean clearAllTemplates = false;

    /**
     * 自定义背景图片资源，要求图片像素 600 x 360.
     */
    private List<TemplateResource> resourceList;

    /**
     * 自定义模板资源，模板图片格式
     * <h5>
     * 滑块验证码
     * <p>
     * 滑块大小为 110*110 格式为png
     * <p>
     * 凹槽大小为 110*110 格式为png
     * <h5>
     * 旋转验证码
     * <p>
     * 滑块大小为 200*200 格式为png
     * <p>
     * 凹槽大小为 200*200 格式为png
     */
    private List<Map<TemplateType, TemplateResource>> templateList;

    /**
     * 容器背景图片资源列表，多个会随机
     */
    private List<Resource> boxBackgroundImageList;
    /**
     * 滑块按钮图片资源列表，多个会随机
     */
    private List<Resource> sliderButtonImageList = Collections.singletonList(new Resource(ResourceType.CLASSPATH, "META-INF/cut-image/default_slider_btn.png"));
    /**
     * logo图片资源列表，多个会随机
     */
    private List<Resource> logoImageList = Collections.singletonList(new Resource(ResourceType.CLASSPATH, "META-INF/cut-image/default_logo.png"));

    /**
     * loading图片资源列表，多个会随机
     */
    private List<Resource> loadingImageList = Collections.singletonList(new Resource(ResourceType.CLASSPATH, "META-INF/cut-image/default_loading.gif"));


    /**
     * 二次验证配置.
     */
    private SecondaryVerificationProperties secondary = new SecondaryVerificationProperties();

    private CaptchaCacheProperties cache = new CaptchaCacheProperties();

    /**
     * 资源类型
     */
    public enum ResourceType {

        CLASSPATH(ClassPathResourceProvider.NAME), URL(URLResourceProvider.NAME);

        public final String name;

        ResourceType(String name) {
            this.name = name;
        }

    }

    /**
     * 模板模式
     */
    public enum TemplateModel {

        SLIDER, ROTATE, CONCAT, WORD_IMAGE_CLICK

    }

    /**
     * 模板类型
     */
    public enum TemplateType {

        active, fixed, matrix;

    }

    /**
     * 模版资源
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TemplateResource extends Resource {

        /**
         * 模式
         */
        private TemplateModel model;

    }

    /**
     * 资源
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Resource {

        /**
         * 资源类型
         */
        private ResourceType type;

        /**
         * 图片路径
         */
        private String path;


    }

    /**
     * 缓存资源模板配置
     */
    @Data
    public static class CaptchaCacheProperties {

        /**
         * 是否开启，默认true
         */
        private Boolean enabled = true;

        /**
         * 缓存开启后，验证码会提前缓存一些生成好的验证数据， 默认是20.
         */
        private Integer cacheSize = 20;

        /**
         * 缓存开启后，缓存拉取失败后等待时间 默认是 5秒钟
         */
        private Integer waitTime = 5000;

        /**
         * 缓存开启后，缓存检查间隔 默认是2秒钟
         */
        private Integer period = 2000;

    }

    /**
     * 二次验证配置
     */
    @Data
    public static class SecondaryVerificationProperties {

        /**
         * 是否开启
         */
        private Boolean enabled = false;

        /**
         * 超时 ms
         */
        private Long expire = 120000L;

        /**
         * 缓存key 前缀
         */
        private String keyPrefix = "secondary";

    }

    /**
     * 过期配置
     */
    @Data
    public static class Expire {
        /**
         * 过期时间
         */
        List<Map<TemplateModel, Long>> modelExpire = new ArrayList<>();
        /**
         * 默认过期时间，默认20s
         */
        private Long defaultExpire = 20000L;
    }

}
